﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows;
using MEsE.NET.Serveripää;
using MEsE.NET.ExtMethods;
using MEsE.NET.Asetukset;
using System.Windows.Threading;

namespace MEsE.NET
{
    /// <summary>
    /// Controllerina toimiva luokka
    /// </summary>
    public partial class App : Application
    {
        List<Window> akkunat = new List<Window>();

        DispatcherTimer ajastin = new DispatcherTimer();

        user kirjautunut = null;

        public string username = string.Empty, passu = string.Empty;

        public event ReceivedMessagesHandler ReceivedMessages;

        //Settings asetukset = new Settings();

        font _fontti = null;
        int _fontSize = 16;

        public font Fontti
        {
            get
            {
                return _fontti;
            }
        }

        public int Fonttikoko
        {
            get
            {
                return _fontSize;
            }
            set
            {
                _fontSize = value;
            }
        }

        public App()
        {
            Login login = new Login();
            login.Show();
            akkunat.Add(login);

            using (Fonttiasetukset asetukset = new Fonttiasetukset())
                _fontti = asetukset.getFontti();
        }

        public void avaaKeskustelu(sanoma Sanoma)
        {
            if (akkunat.OfType<Keskusteluikkuna>().Where(akkuna => akkuna.Kaveri == Sanoma.from).Count() == 0)
            {
                Keskusteluikkuna keskustelu = new Keskusteluikkuna(Sanoma.from.nayttönimi, kirjautunut, this);

                akkunat.Add(keskustelu);
                keskustelu.Show();

                keskustelu.Receive(this, new ReceivedMessagesEventArgs(Sanoma));
            }
            else
            {
                akkunat.OfType<Keskusteluikkuna>().Where(akkuna => akkuna.Kaveri == Sanoma.from).ForEach(akkuna =>
                    akkuna.Receive(this, new ReceivedMessagesEventArgs(Sanoma)));
            }
        }

        public void avaaKeskustelu(String keskustelijanNimi)
        {
            Keskusteluikkuna keskustelu = new Keskusteluikkuna(keskustelijanNimi, kirjautunut, this);
            akkunat.Add(keskustelu);

            keskustelu.Show();
        }

        public void tuhoaAkkunatTyyppiä<E>() where E: Window
        {
            List<E> tuhottavat = new List<E>();
            akkunat.OfType<E>().ForEach(akkuna => tuhottavat.Add(akkuna));

            tuhottavat.ForEach(akkuna => 
                {
                    akkunat.Remove(akkuna);
                    akkuna.Close();
                });
        }

        public void kirjautumaOnnistui(user User)
        {
            if (User == null) return;

            kirjautunut = User;

            Pääakkuna akkuna = new Pääakkuna(kirjautunut);
            akkuna.Show();

            akkunat.Add(akkuna);
            
            tuhoaAkkunatTyyppiä<Login>();

            ajastin.Interval = new TimeSpan(0, 0, 0, 2);

            //Jotta this saadaan closuren sisäänkin
            App minä = this;
            ajastin.Tick += (s, e) =>
            {
                var sanomat = getViestit();

                sanomat.ForEach(Sanoma =>
                    {
                        if(ReceivedMessages != null)
                            ReceivedMessages(minä, new ReceivedMessagesEventArgs(Sanoma));
                    })
                    .Where(Sanoma => !Sanoma.isHyväksytty()).ForEach(Sanoma => avaaKeskustelu(Sanoma));
                
            };
            ajastin.Start();
        }

        private sanoma[] getViestit()
        {
            MEsE_WSClient client = new MEsE_WSClient();
            var viestit = client.getMessages(kirjautunut);

            return viestit ?? new sanoma[] { };
        }
    }

    public delegate void ReceivedMessagesHandler(object Controller, ReceivedMessagesEventArgs e);

    public class ReceivedMessagesEventArgs : EventArgs
    {
        
        public sanoma Viesti
        { get; set; }

        public ReceivedMessagesEventArgs(sanoma viesti)
        {
            Viesti = viesti;
            viestiHyväksytty = false;
        }

        public bool viestiHyväksytty
        {
            get
            {
                return Viesti.isHyväksytty();
            }
            set
            {
                Viesti.setHyväksytty(value);
            }
        }
    }
}
